<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <title>随机点</title>
    <style>
        body {
            margin: 0;
            overflow: hidden;
        }

        #canvas {
            background-color: antiquewhite;
        }
    </style>
</head>

<body>
<canvas id="canvas"></canvas>
<!-- 顶点着色器 -->
<script id="vertexShader" type="x-shader/x-vertex">
      attribute vec4 a_Position;
      attribute float a_PointSize;
      void main(){
          //点位
          gl_Position=a_Position;
          //尺寸
          gl_PointSize=a_PointSize;
      }
    </script>
<!-- 片元着色器 -->
<script id="fragmentShader" type="x-shader/x-fragment">
      precision mediump float;
      uniform vec4 u_FragColor;
      void main(){
          gl_FragColor=u_FragColor;
      }
  </script>
<script type="module">
  import { initShaders } from "../jsm/Utils.js";

  const canvas = document.querySelector("#canvas");
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;

  // 获取着色器文本
  const vsSource = document.querySelector("#vertexShader").innerText;
  const fsSource = document.querySelector("#fragmentShader").innerText;

  //三维画笔
  const gl = canvas.getContext("webgl");

  //初始化着色器
  initShaders(gl, vsSource, fsSource);

  //设置attribute 变量
  // a_Position=vec4(1,0,0,1)
  const a_Position = gl.getAttribLocation(gl.program, "a_Position");
  const a_PointSize = gl.getAttribLocation(gl.program, "a_PointSize");
  const u_FragColor = gl.getUniformLocation(gl.program, "u_FragColor");

  const a_points = [
    { x: 0, y: 0, size: 10, color: { r: 1, g: 0, b: 0, a: 1 } },
  ];

  //修改attribute 变量
  // gl.vertexAttrib3f(a_Position, 0, 1, 0);
  // gl.vertexAttrib2f(a_Position, 0.5, 0.5);
  // gl.vertexAttrib1f(a_Position, 0.1);

  //声明颜色 rgba
  gl.clearColor(0, 0, 0, 1);
  //刷底色
  gl.clear(gl.COLOR_BUFFER_BIT);

  //绘制顶点
  // gl.drawArrays(gl.POINTS, 0, 1);
  render();

  // 鼠标点击事件
  canvas.addEventListener("click", ({ clientX, clientY }) => {
    console.log(clientX, clientY);
    const { left, top, width, height } = canvas.getBoundingClientRect();
    const [cssX, cssY] = [clientX - left, clientY - top];

    //解决坐标原点位置的差异
    const [halfWidth, halfHeight] = [width / 2, height / 2];
    const [xBaseCenter, yBaseCenter] = [
      cssX - halfWidth,
      cssY - halfHeight,
    ];
    // 解决y 方向的差异
    const yBaseCenterTop = -yBaseCenter;
    //解决坐标基底的差异
    const [x, y] = [xBaseCenter / halfWidth, yBaseCenterTop / halfHeight];

    // gl.vertexAttrib2f(a_Position, x, y);
    // gl.clear(gl.COLOR_BUFFER_BIT);
    // gl.drawArrays(gl.POINTS, 0, 1);
    const size = Math.random() * 50 + 10;
    const n = Math.random();
    const color = { r: n, g: n, b: 1, a: 1 };
    a_points.push({ x, y, size, color });
    render();
  });

  // 渲染方法
  function render() {
    gl.clear(gl.COLOR_BUFFER_BIT);
    a_points.forEach(({ x, y, size, color: { r, g, b, a } }) => {
      gl.vertexAttrib2f(a_Position, x, y);
      gl.vertexAttrib1f(a_PointSize, size);
      // gl.uniform4f(u_FragColor, r, g, b, a);
      const arr = new Float32Array([r, g, b, a]);
      gl.uniform4fv(u_FragColor, arr);
      gl.drawArrays(gl.POINTS, 0, 1);
    });
  }
</script>
</body>

</html>
